package com.sheng.leetcode.year2023.month02.day08;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author liusheng
 * @date 2023/02/08
 * <p>
 * 1233. 删除子文件夹<p>
 * <p>
 * 你是一位系统管理员，手里有一份文件夹列表 folder，你的任务是要删除该列表中的所有 子文件夹，并以 任意顺序 返回剩下的文件夹。<p>
 * 如果文件夹 folder[i] 位于另一个文件夹 folder[j] 下，那么 folder[i] 就是 folder[j] 的 子文件夹 。<p>
 * 文件夹的「路径」是由一个或多个按以下格式串联形成的字符串：'/' 后跟一个或者多个小写英文字母。<p>
 * 例如，"/leetcode" 和 "/leetcode/problems" 都是有效的路径，而空字符串和 "/" 不是。<p>
 * <p>
 * 示例 1：<p>
 * 输入：folder = ["/a","/a/b","/c/d","/c/d/e","/c/f"]<p>
 * 输出：["/a","/c/d","/c/f"]<p>
 * 解释："/a/b/" 是 "/a" 的子文件夹，而 "/c/d/e" 是 "/c/d" 的子文件夹。<p>
 * <p>
 * 示例 2：<p>
 * 输入：folder = ["/a","/a/b/c","/a/b/d"]<p>
 * 输出：["/a"]<p>
 * 解释：文件夹 "/a/b/c" 和 "/a/b/d/" 都会被删除，因为它们都是 "/a" 的子文件夹。<p>
 * <p>
 * 示例 3：<p>
 * 输入: folder = ["/a/b/c","/a/b/ca","/a/b/d"]<p>
 * 输出: ["/a/b/c","/a/b/ca","/a/b/d"]<p>
 * <p>
 * 提示：<p>
 * 1 <= folder.length <= 4 * 10^4<p>
 * 2 <= folder[i].length <= 100<p>
 * folder[i] 只包含小写字母和 '/'<p>
 * folder[i] 总是以字符 '/' 起始<p>
 * 每个文件夹名都是 唯一 的<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/remove-sub-folders-from-the-filesystem">1233. 删除子文件夹</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode1233 {

    @Test
    public void test01() {
        String[] folder = {"/a", "/a/b", "/c/d", "/c/d/e", "/c/f"};
//        String[] folder = {"/a", "/a/b/c", "/a/b/d"};
//        String[] folder = {"/a/b/c", "/a/b/ca", "/a/b/d"};
//        String[] folder = {"/c", "/d/c/e"};
        System.out.println(new Solution().removeSubfolders(folder));
    }
}

class Solution {
    public List<String> removeSubfolders(String[] folder) {
        Arrays.sort(folder);
        List<String> list = new ArrayList<>();
        list.add(folder[0]);
        for (int i = 1; i < folder.length; i++) {
            // 最后一个进入集合的元素的长度
            int index = list.get(list.size() - 1).length();
            // 当前元素长度大于最后一个进入集合的元素的长度，并且当前元素的前部分和最后一个进入集合的元素相等，相等的部分后面接的是一个 /
            if (!(index < folder[i].length() && list.get(list.size() - 1).equals(folder[i].substring(0, index)) && folder[i].charAt(index) == '/')) {
                list.add(folder[i]);
            }
        }
        return list;
    }
}
